热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

青葱|中将_Javascript中setTimeout设置为0的意义?

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Javascript中setTimeout设置为0的意义?相关的知识,希望对你有一定的参考价值。知乎网友提问如下

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Javascript中setTimeout设置为0的意义?相关的知识,希望对你有一定的参考价值。


知乎网友提问如下



setTimeout设置为0的意义,求解答?


get是getId。
第一个的focus,select不会触发,为什么呢
第二个设置为0可以触发了,为什么


setTimeout设置为0的意义,简单来说就是为了让setTimeout后的代码先于setTimeout的回调函数运行。如果你有vue使用经验的,可以将其类比成vue中的$nextTick方法,该方法就是在下次 DOM 更新循环结束之后执行延迟回调,以便回调中操作DOM的代码能获得最新的DOM。

为什么会这样呢?这个跟Javascript的Event Loop有关系,不难,我这里尝试看是否能简单点跟大家说清楚。

先看下面的代码:

function main()
console.log('Hi');
setTimeout(function cb()
console.log('there')
, 0);
console.log('JSConfEU')

程序在我们的浏览器中运行时:


  • 首先会执行第一行,在Console控制台中输出’Hi’

  • 到了第二行时,浏览器内部的JS引擎如V8,发现调用的是一个异步方法setTimeout,它首先会把setTimeout放到stack调用栈中,但是因为是异步的,所以该调用立刻就返回了。同时,该异步方法是在浏览器的webapis中执行的(浏览器的另外一个线程),因为设置的超时是0,所以也会立即执行完,然后将回调cb放到 task queue中,等待event loop在下个循环中将cb取出来执行

  • 那下一步v8引擎会打印’JSConfEU’还是回调cb中的‘there’呢?答案是,肯定会打印’JSConfEU’!为什么呢?因为Javascript运行时v8运行的其中一个规则就是,只要调用栈stack里面还有没有执行完的代码,就不会从Callback Queue中取任何任务来执行。


  • 前面的文字结合上图应该能更好理解。图片当前的状态就是webapis那边刚执行完setTimeout,浏览器把回调cb放入到task queue(也就是Callback Queue)中。下一步就是要决定继续跑stack里面的方法,还是task queue中的回调。

经过上面分析,我们现在应该知道在main函数中,虽然setTimeout是设置成0,但是,其中的回调是要等main方法所有的代码都执行完才会执行的。

那么现在我们回到题主的例子中:


  • 第一个focus没有起作用,基本可以断定是因为当前代码中的input元素应该还是虚拟DOM中,页面还没有真正渲染出来,所以这时对其设置focus是无效的。

  • 第二个focus所以起作用,原理就是上面说的setTimeout,虽然设置的是0,但是它的回调是要放到Callback Queue中,等到其他代码都执行完,才会进行调用的。而这里的其他代码,就包括了页面的渲染,也就是说真实DOM已经生成了。



我是@天地会珠海分舵,「青葱日历」和「三日清单」 作者。能力一般,水平有限,觉得我说的还有那么点道理的不妨点个赞关注下!



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
he小任a
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有